package com.zhanjixun.weixin;

import com.zhanjixun.weixin.conts.MsgType;
import com.zhanjixun.weixin.domain.WxMsg;
import com.zhanjixun.weixin.utils.UserTools;
import lombok.Data;
import lombok.extern.log4j.Log4j;
import org.apache.commons.lang3.StringUtils;

import java.io.File;

/**
 * 发信工具
 *
 * @author :zhanjixun
 * @date : 2018/11/18 15:02
 * @see UserTools
 */
@Data
@Log4j
public class Messenger {

    private Weixin weixin;

    Messenger(Weixin weixin) {
        this.weixin = weixin;
    }

    /**
     * 发送文本消息
     *
     * @param toUserName 接收用户
     * @param message    文本内容
     */
    public WxMsg sendTextMsg(String toUserName, String message) {
        if (StringUtils.isBlank(message)) {
            log.warn("不能发送空白消息");
            return null;
        }
        WxMsg wxMsg = weixin.getWxService().webWxSendMsg(toUserName, message, MsgType.TEXT.getCode());
        weixin.getMsgSendHistory().add(wxMsg);
        log.info(String.format("发送文本消息给[%s]:%s", UserTools.userName2nickName(toUserName), message));
        return wxMsg;
    }

    /**
     * 发送图片消息
     *
     * @param toUserName 接收用户
     * @param image      图片文件
     */
    public WxMsg sendImgMsg(String toUserName, File image) {
        if (image == null || !image.exists()) {
            log.error("文件不存在" + image.getAbsolutePath());
            return null;
        }
        String mediaId = weixin.getWxService().webWxUploadMedia(toUserName, image);
        if (StringUtils.isBlank(mediaId)) {
            log.warn("上传图片失败，没有返回MediaID" + mediaId);
            return null;
        }
        WxMsg wxMsg = weixin.getWxService().webWxSendMsgImg(toUserName, mediaId);
        weixin.getMsgSendHistory().add(wxMsg);
        log.info(String.format("发送图片消息给[%s] %s", UserTools.userName2nickName(toUserName), image.getAbsolutePath()));
        return wxMsg;
    }

    /**
     * 发送文件消息
     *
     * @param toUserName 接收用户
     * @param file       文件
     */
    public WxMsg sendFileMsg(String toUserName, File file) {
        if (file == null || !file.exists()) {
            log.error("文件不存在");
            return null;
        }
        String mediaId = weixin.getWxService().webWxUploadMedia(toUserName, file);
        if (StringUtils.isBlank(mediaId)) {
            log.warn("上传文件失败，没有返回MediaID" + mediaId);
            return null;
        }
        WxMsg wxMsg = weixin.getWxService().webWxSendAppMsg(toUserName, file.getName(), file.length(), StringUtils.substringAfter(file.getName(), "."), mediaId);
        weixin.getMsgSendHistory().add(wxMsg);
        log.info(String.format("发送文件消息给[%s] %s", UserTools.userName2nickName(toUserName), file.getAbsolutePath()));
        return wxMsg;
    }

    /**
     * 发送视频消息
     *
     * @param toUserName 接收用户
     * @param video      视频文件
     */
    public WxMsg sendVideoMsg(String toUserName, File video) {
        if (video == null || !video.exists()) {
            log.error("文件不存在");
            return null;
        }
        String mediaId = weixin.getWxService().webWxUploadMedia(toUserName, video);
        if (StringUtils.isBlank(mediaId)) {
            log.warn("上传文件失败，没有返回MediaID" + mediaId);
            return null;
        }
        log.info(mediaId);
        WxMsg wxMsg = weixin.getWxService().webWxSendVideoMsg(toUserName, mediaId);
        weixin.getMsgSendHistory().add(wxMsg);
        log.info(String.format("发送视频消息给[%s] %s", UserTools.userName2nickName(toUserName), video.getAbsolutePath()));
        return wxMsg;
    }

    /**
     * 发送动画表情消息
     *
     * @param toUserName 接收用户
     * @param gif        现在只看到gif图片能使用这个接口
     * @return
     */
    public WxMsg sendEmoticonMsg(String toUserName, File gif) {
        if (gif == null || !gif.exists()) {
            log.error("文件不存在");
            return null;
        }
        String mediaId = weixin.getWxService().webWxUploadMedia(toUserName, gif);
        if (StringUtils.isBlank(mediaId)) {
            log.warn("上传文件失败，没有返回MediaID");
            return null;
        }
        WxMsg wxMsg = weixin.getWxService().webWxSendEmoticon(toUserName, mediaId);
        weixin.getMsgSendHistory().add(wxMsg);
        log.info(String.format("发送动画表情消息给[%s] %s", UserTools.userName2nickName(toUserName), gif.getAbsolutePath()));
        return wxMsg;
    }


    public WxMsg sendEmoticonMsg(String toUserName, byte[] data, String fileName) {
        String mediaId = weixin.getWxService().webWxUploadMedia(toUserName, data, fileName);
        if (StringUtils.isBlank(mediaId)) {
            log.warn("上传文件失败，没有返回MediaID");
            return null;
        }
        WxMsg wxMsg = weixin.getWxService().webWxSendEmoticon(toUserName, mediaId);
        weixin.getMsgSendHistory().add(wxMsg);
        log.info(String.format("发送动画表情消息给[%s] %s", UserTools.userName2nickName(toUserName), fileName));
        return wxMsg;
    }

    /**
     * 撤回消息
     *
     * @param msgId
     * @param toUserName
     */
    public boolean revokeMsg(String msgId, String toUserName) {
        return weixin.getWxService().webWxRevokeMsg(msgId, toUserName);
    }

}
